home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
cislib_a
/
fileli.xmo
< prev
next >
Wrap
Text File
|
1995-04-22
|
7KB
|
327 lines
(* FILELIB.I - Routines to allow the use of standard ATARI I/O calls in KYAN
Pascal programs.
IOCBUsed - If called immediately following a pascal Reset or Rewrite call
this function will return the number of the IOCB that was used.
FileOpen - Exactly like the ATARI Basic OPEN command.
FileClose - Exactly like the ATARI Basic CLOSE command.
FileGet - Replace the parameters REC and RECLEN with the name and length
of your record and this routine will read one record from the
file.
FilePut - The inverse of FileGet.
FileNote - Exactly like the ATARI Basic NOTE command.
FilePoint - Exactly like the ATARI Basic POINT command.
I don't recommend that you mix these routines with the standard Pascal
I/O routines, though CLOSE might be useful. They were written for use in a
small database program the DEMANDED true random access files. Use them with
care as none of the protection provided by Pascal is present here. *)
Function IOCBUsed : Integer;
Begin
#a
LDA $2E ;Get IOCB #
LSR A ;Divide by 16
LSR A
LSR A
LSR A
LDY #3 ;Store in IOCBnum
STA (SP),Y
INY
LDA #0
STA (SP),Y
#
End; (* IOCBUsed *)
Procedure FileOpen(IOCBnum,IOdir,Auxbyte : Integer;
Var FileName : String15);
Begin
#a
ICHID EQU $0340
ICDNO EQU $0341
ICCMD EQU $0342
ICSTA EQU $0343
ICBAL EQU $0344
ICBAH EQU $0345
ICPTL EQU $0346
ICPTH EQU $0347
ICBLL EQU $0348
ICBLH EQU $0349
ICAX1 EQU $034A
ICAX2 EQU $034B
ICAX3 EQU $034C
ICAX4 EQU $034D
ICAX5 EQU $034E
ICAX6 EQU $034F
CIOV EQU $E456
; T = LSB of 'FileName'
; T+1 = MSB of 'FileName'
; T+2 = LSB of AuxByte
; T+3 = MSB of AuxByte (Unused)
; T+4 = LSB of IOdir
; T+5 = MSB of IOdir (Unused)
; T+6 = LSB of IOCBnum
; T+7 = MSB of IOCBnum (Unused)
TXA ;Save X register
PHA
LDX #7 ;Copy heap
LDY #10
CL1 LDA (SP),Y
STA T,X
DEY
DEX
BPL CL1
LDA T+6 ;Get IOCB #
ASL A ;Multiply by 16
ASL A
ASL A
ASL A
TAX ;Move to X register
LDA #3 ;Open command
STA ICCMD,X
LDA T ;Filename address
STA ICBAL,X
LDA T+1
STA ICBAH,X
LDA T+4 ;Data direction
STA ICAX1,X
LDA T+2 ;Aux byte
STA ICAX2,X
JSR CIOV ;Do the I/O
PLA ;Restore X register
TXA
#
End; (* FileOpen *)
Procedure FileClose(IOCBnum : Integer);
Begin
#a
; T = LSB of IOCBnum
; T+1 = MSB of IOCBnum (Unused)
TXA ;Save X register
PHA
LDX #1 ;Copy heap
LDY #4
CL2 LDA (SP),Y
STA T,X
DEY
DEX
BPL CL2
LDA T ;Get IOCB #
ASL A ;Multiply by 16
ASL A
ASL A
ASL A
TAX ;Move to X register
LDA #12 ;Close command
STA ICCMD,X
JSR CIOV ;Do the I/O
PLA ;Restore X register
TAX
#
End; (* FileClose *)
Procedure FileGet(IOCBnum : Integer;
Var Rec : RecType;
RecLen : Integer);
Begin
#a
; T = LSB of Length
; T+1 = MSB of Length
; T+2 = LSB of 'Word'
; T+3 = MSB of 'Word'
; T+4 = LSB of IOCBnum
; T+5 = MSB of IOCBnum (Unused)
TXA ;Saved X register
PHA
LDX #5 ;Copy heap
LDY #8
CL3 LDA (SP),Y
STA T,X
DEY
DEX
BPL CL3
LDA T+4 ;Get IOCB #
ASL A ;Multiply by 16
ASL A
ASL A
ASL A
TAX ;Move to X register
LDA #7 ;Get record command
STA ICCMD,X
LDA T+2 ;Data address
STA ICBAL,X
LDA T+3
STA ICBAH,X
LDA T ;Data length
STA ICBLL,X
LDA T+1
STA ICBLH,X
JSR CIOV ;Do the I/O
PLA ;Restore X register
TAX
#
End; (* FileGet *)
Procedure FilePut(IOCBnum : Integer;
Var Rec : RecType;
RecLen : Integer);
Begin
#a
; T = LSB of Length
; T+1 = MSB of Length
; T+2 = LSB of 'Word'
; T+3 = MSB of 'Word'
; T+4 = LSB of IOCBnum
; T+5 = MSB of IOCBnum
TXA ;Save X register
PHA
LDX #5 ;Copy heap
LDY #8
CL4 LDA (SP),Y
STA T,X
DEY
DEX
BPL CL4
LDA T+4 ;Get IOCB #
ASL A ;Multiply by 16
ASL A
ASL A
ASL A
TAX ;Move to X register
LDA #11 ;Put record command
STA ICCMD,X
LDA T+2 ;Data address
STA ICBAL,X
LDA T+3
STA ICBAH,X
LDA T ;Data length
STA ICBLL,X
LDA T+1
STA ICBLH,X
JSR CIOV ;Do the I/O
PLA ;Restore X register
TAX
#
End; (* FilePut *)
Procedure FileNote(IOCBnum : Integer;
Var Sector,Byte : Integer);
Begin
#a
; T = LSB of 'Byte'
; T+1 = MSB of 'Byte' (Unused)
; T+2 = LSB of 'Sector'
; T+3 = MSB of 'Sector'
; T+4 = LSB of IOCBnum
; T+5 = MSB of IOCBnum (Unused)
TXA ;Save X register
PHA
LDX #5 ;Copy heap
LDY #8
CL5 LDA (SP),Y
STA T,X
DEY
DEX
BPL CL5
LDA T+4 ;Get IOCB #
ASL A ;Multiply by 16
ASL A
ASL A
ASL A
PHA ;Save for later
TAX ;Move to X register
LDA #38 ;Note command
STA ICCMD,X
JSR CIOV ;Do the I/O
PLA ;Get IOCB # X 16
TAX ;Move to X register
LDY #0
LDA ICAX5,X ;Get LSB of Byte
STA (T),Y
LDA ICAX3,X ;Get LSB of Sector
STA (T+2),Y
INY
LDA #0 ;MSB of Byte
STA (T),Y
LDA ICAX4,X ;Get MSB of Sector
STA (T+2),Y
PLA ;Restore X register
TAX
#
End; (* FileNote *)
Procedure FilePoint(IOCBnum,Sector,Byte : Integer);
Begin
#a
; T = LSB of Byte
; T+1 = MSB of Byte (Unused)
; T+2 = LSB of Sector
; T+3 = MSB of Sector
; T+4 = LSB of IOCBnum
; T+5 = MSB of IOCBnum (Unused)
TXA ;Save X register
PHA
LDX #5 ;Copy heap
LDY #8
CL6 LDA (SP),Y
STA T,X
DEY
DEX
BPL CL6
LDA T+4 ;Get IOCB #
ASL A ;Multiply by 16
ASL A
ASL A
ASL A
TAX ;Move to X register
LDA #37 ;Point command
STA ICCMD,X
LDA T+2 ;LSB of Sector
STA ICAX3,X
LDA T+3 ;MSB of Sector
STA ICAX4,X
LDA T ;LSB of Byte
STA ICAX5,X
JSR CIOV ;Do the I/O
PLA ;Restore X register
TAX
#
End; (* FilePoint *)
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT